package registry

import (
	"context"
	"io"
)

type Registry interface {
	// Mark: 1. 和网络打交道，应该添加context参数 2. 将注册的内容封装成结构体
	// Register() error
	Register(context.Context, ServiceInstance) error
	UnRegister(context.Context, ServiceInstance) error

	// Mark: 1. 直观上订阅只知道服务的名字 2. 返回一个具体的实例相当于拉取信息 1 次，
	// 如果想要获取数据的变化，需要自己在 resolver.ResolveNow 中开协程轮询监控，
	// 但是resolver.ResolveNow定义上来说只做一次解析，而且可能多次调用
	// Subscribe(context.Context, ServiceInstance) (ServiceInstance, error)
	// Mark: 1. 根据服务名字进行订阅，符合直觉 2. 返回订阅的事件，需要在外部开一个协程进行监听并处理
	// Subscribe(ctx context.Context, sn string) (<-chan Event, error)
	// Mark: 订阅不要传入 ctx，是因为订阅会一直发生，直到关闭这个注册中心
	Subscribe(context.Context, string) (<-chan Event, error)
	// Mark: 为什么不需要设计取消订阅的接口, 取消订阅
	UnSubscribe(context.Context, string) error
	// Mark: Subcribe 接口只是获得变更的通知，没有获取数据
	// 当获得变更通知后，client要主动拉去数据
	ListServices(context.Context, string) ([]ServiceInstance, error)
	io.Closer
}

type ServiceInstance struct {
	Name string // 服务名称
	Addr string // 服务地址
}

type Event struct {
	Type string
}
